package com.cskaoyan.javase.array._3exception._2null;

import org.junit.Test;

/**
 * null是引用数据类型引用的一个特殊取值,它是一个字面值常量
 * 引用等于null,表示引用指向虚无,该引用是不可用的
 * 那么这时如果还想通过引用 访问/操作 对象
 * 就会报错,抛出空指针异常(NullPointerException)
 *
 * 比如使用引用访问对象的属性/调用对象的方法
 * 但是像直接打印引用这种不需要访问对象的操作,是不会抛出空指针异常的
 *
 * 注意事项：
 *
 * 1.空指针异常（NullPointerExceptionE），简称NPE，是Java之中最负盛名的异常，没有之一。
 * 以后大家会天天和引用数据类型打交道，也会每天和空指针异常打交道。空指针异常是Java中最常见,最普通的异常,没有之一.
 *
 * 2.空指针异常在多数情况下是有害的，会导致程序意外终止，避免空指针异常是Java程序员的必修课之一。
 * 常见的、最简单朴实的规避手段就是通过if进行判断，判断出引用不会指向null后再使用引用操作对象。
 *
 * 3.空指针异常针对所有引用数据类型，不仅仅是数组操作。
 *
 * 最后再提一点：
 * 我们在开发时，要明确知道程序中的引用哪里会指向null，哪里完全不会指向null，对于：
 *      1.那些逻辑上，可能会指向null的引用，要在使用前慎重判断。
 *              如果等于null，需要做出相应处理（反正不能访问对象）
 *              判断不为null之后才能使用该引用访问对象。
 *      2.那些逻辑上，完全不可能等于null的引用，就不应该做判断了。
 *      一旦程序抛出空指针异常，要去排查为什么引用会等于null，然后修正程序。
 *
 *
 * @since 14:46
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    @Test
    public void test() {
        int[] arr = null;
        // System.out.println(arr.length);
        System.out.println(arr);
    }

    @Test
    public void test2() {
        double[] arr2 = null;
        // 为了避免空指针异常,要先用if做判断,再使用引用
        if (arr2 != null) {
            System.out.println(arr2.length);
        }
        /*
            这里仍然会产生空指针异常
            因为对象根本就没有
            不可能数组下标越界
         */
        // System.out.println(arr2[0]);

        /*
            注意事项:
            数组长度不可变指的是数组对象一旦在堆上创建,除非把它销毁,否者它的长度永远不可以改变
            但是:
                 1.数组对象的中元素可不可以改变?  可以改变,不限制
                 2.指向该数组对象的引用可不可以改变?就是它可不可以指向新的对象?
                    可以,不限制
         */
        arr2 = new double[3];
        System.out.println(arr2[3]);
    }

    @Test
    public void test3() {
        String str = null;
        // Method invocation 'length' will produce 'NullPointerException'
        System.out.println(str.length());
    }
}
